package com.example.xitdemo1.Controller;

import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatModel;
import jakarta.servlet.http.HttpSession;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.ai.chat.memory.InMemoryChatMemory;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.util.*;

import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;
import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;

@RestController
@RequestMapping("ai")
public class AIController {

    private static final Map<String, List<String>> responseMap = new HashMap<>();

    static {
        responseMap.put("general", Arrays.asList(
                "我明白你的意思了",
                "这是个很有趣的问题",
                "让我想想...",
                "确实如此",
                "你说得对"
        ));

        responseMap.put("电影", Arrays.asList(
                "《肖申克的救赎》 - 希望是一个好东西，也许是最好的，好东西是不会消亡的",
                "《泰坦尼克号》 - 经典的爱情故事",
                "《盗梦空间》 - 烧脑科幻大作",
                "《千与千寻》 - 宫崎骏的动画神作",
                "《阿甘正传》 - 生活就像一盒巧克力"
        ));

        responseMap.put("笑话", Arrays.asList(
                "人总要犯错误的，否则正确之路人满为患。",
                "日出只要在日落前出现就好，上课只要在下课前到达就好。",
                "你的丑和你的脸没有关系……",
                "你可以像猪一样的生活，但你永远都不能像猪那样快乐！",
                "穿别人的鞋，走自己的路，让他们打的找去吧。"
        ));

        responseMap.put("小说", Arrays.asList(
                "《三体》 - 刘慈欣的科幻巨作，讲述人类文明与三体文明的惊心动魄的故事",
                "《活着》 - 余华描写了人生的苦难与求生意志",
                "《百年孤独》 - 马尔克斯的魔幻现实主义代表作",
                "《围城》 - 钱钟书的讽刺小说，描写了中国知识分子的生活",
                "《平凡的世界》 - 路遥描写了中国农村生活的史诗",
                "《红楼梦》 - 中国古典文学巅峰之作",
                "《白鹿原》 - 陈忠实的关于陕西农村的家族史诗",
                "《追风筝的人》 - 卡勒德·胡赛尼讲述的救赎故事"
        ));
    }

    @GetMapping("chat0")
    public String chat0(String message){
        Random random = new Random();
        String type = (message == null || message.trim().isEmpty()) ? "general" : message.trim();

        List<String> responses = responseMap.getOrDefault(type, responseMap.get("general"));
        String response = responses.get(random.nextInt(responses.size()));

        return "来自AI的响应：" + response;
    }

    private final ChatClient chatClient;

    public AIController(DashScopeChatModel dashscopeChatModel) {
        //初始化基于内存的对话记忆
        ChatMemory chatMemory = new InMemoryChatMemory();

        // 构建带有记忆功能的chatClient
        this.chatClient = ChatClient.builder(dashscopeChatModel)
                .defaultAdvisors(new MessageChatMemoryAdvisor(chatMemory))
                .build();
    }

    @GetMapping("/chat")
    public String chat(String message) {
        return this.chatClient.prompt()
                .user(message)
                .call()
                .content();
    }

    @GetMapping(value = "/chat-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE + ";charset=UTF-8")
    public Flux<String> stream(String prompt, HttpSession session){
        return this.chatClient.prompt()
                .user(prompt)
                .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, session.getId())
                        .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))//记录5条
                .stream()
                .content();
    }

    @GetMapping(value = "/chat-stream2", produces = MediaType.TEXT_EVENT_STREAM_VALUE + ";charset=UTF-8")
    public Flux<String> stream2(String prompt, HttpSession session){
        return this.chatClient.prompt()
                .system("你现在是一位非常严厉的老师，无论我问什么问题，都要用最严厉的口吻回答。")
                .user(prompt)
                .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, session.getId())
                        .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 10))//记录5条
                .stream()
                .content();
    }

    final String template = "请问{author}最受欢迎的书是哪本书？什么时候发布的？书的内容是什么？";
    /**
     * 只需提供作者姓名，返回该作者最受欢迎的书，出版时间和书的内容概述。
     * @param prompt 作者姓名
     * @return 该作者最受欢迎的书，出版时间和书的内容概述。
     */
    @GetMapping(value = "/chat-stream3", produces = MediaType.TEXT_EVENT_STREAM_VALUE + ";charset=UTF-8")
    public Flux<String> stream3(String prompt, HttpSession session){
        String replacedPrompt = template.replace("{author}", prompt);
        return this.chatClient.prompt()
                .user(replacedPrompt)
                .advisors(spec -> spec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, session.getId())
                        .param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 20))
                .stream()
                .content();
    }


}